Resume events when disconnecting from a frame clock
authorTom Hughes <tom@compton.nu>
Mon, 26 Jan 2015 21:52:00 +0000 (21:52 +0000)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 30 Jan 2015 22:32:58 +0000 (17:32 -0500)
If we are disconnecting from a frame clock that has paused event
processing and hasn't issued a resume yet make sure we resume the
events or they will stay blocked forever.

https://bugzilla.gnome.org/show_bug.cgi?id=742636

gdk/gdkinternals.h
gdk/gdkwindow.c

index cbb87e44a28cf5fc8e60945f9f400cc10392de07..d1d1e4d1676c062458526e54d8368220756407dd 100644 (file)
@@ -333,6 +333,7 @@ struct _GdkWindow
   guint in_update : 1;
   guint geometry_dirty : 1;
   guint event_compression : 1;
+  guint frame_clock_events_paused : 1;
 
   /* The GdkWindow that has the impl, ref:ed if another window.
    * This ref is required to keep the wrapper of the impl window alive
index 778fd5fc035a295659158345da8510c65d47c850..a12a43e1e55a7aaa60bbf95943d67f9157862524 100644 (file)
@@ -10913,6 +10913,8 @@ gdk_window_flush_events (GdkFrameClock *clock,
   _gdk_display_pause_events (display);
 
   gdk_frame_clock_request_phase (clock, GDK_FRAME_CLOCK_PHASE_RESUME_EVENTS);
+
+  window->frame_clock_events_paused = TRUE;
 }
 
 static void
@@ -10939,6 +10941,8 @@ gdk_window_resume_events (GdkFrameClock *clock,
 
   display = gdk_window_get_display (window);
   _gdk_display_unpause_events (display);
+
+  window->frame_clock_events_paused = TRUE;
 }
 
 static void
@@ -10971,6 +10975,11 @@ gdk_window_set_frame_clock (GdkWindow     *window,
 
   if (window->frame_clock)
     {
+      if (window->frame_clock_events_paused)
+        {
+          gdk_window_resume_events (window->frame_clock, G_OBJECT (window));
+        }
+
       g_signal_handlers_disconnect_by_func (G_OBJECT (window->frame_clock),
                                             G_CALLBACK (gdk_window_flush_events),
                                             window);